#include "keys.h"


void Writefile(FILE *origem, FILE *destino, int atual) {
	char *nome;

	nome = (char *)malloc(sizeof(char)*(tam_titulo+2)); 
	fseek(origem, atual, SEEK_SET);	 /*coloca o cursor de leitura na posicao atual */
	fgets(nome, tam_titulo+1, origem);
	Fillblanks(nome,tam_titulo); 
	fputs(nome, destino); /* escreve a str nome no arquivo */
	free(nome); /* libera a memoria */
	
}


void Fillblanks(char nome[], int tamanho) {
	int i;
	for (i=(strlen(nome)); i<tamanho; i++) {
		nome[i] = ' ';
	}
	nome[tamanho] = '\0'; /*completa a str com espacos de acordo com o seu tamanho */
}


int Le_PK(pNo_PK *obras, char *titulo, int nrr, int tamanho, int vetor) {
	if ((tamanho % 20 == 0) && (tamanho != 0)) {	 /* realoca memoria caso tamanho maximo seja atingido*/
		*obras = realloc (*obras,(tamanho+tamanho)*sizeof(No_PK)); }

	if(titulo[4] == '*') return tamanho;
	else {
		strcpy((*obras)[tamanho].titulo, titulo); /*insere no vetor obras e adiciona '/0' no fim do titulo*/
		(*obras)[tamanho].nrr = nrr;
		return tamanho+1; /* retorna o novo tamanho */
	}
}


void GravaArray(char string[], int tamanho, pNo_PK obras) {
	int i;
	FILE *teste = fopen ( string , "w" );
	for(i=0;i<tamanho;i++) {
		fputs(obras[i].titulo,teste);  /*grava as infos do vetor sk no disco (sk_*.dat) */ 
		if(obras[i].nrr == -1) 
			fprintf(teste, "%.3d", obras[i].nrr);
		else
			fprintf(teste, "%.4d", obras[i].nrr);
	}
	fclose(teste);
}

void Str_toupper(char *s) { 
while(*s)
	{
		*s=toupper(*s); /* Transforma uma str em maiuscula char por char */
		s++;
	}
}


int Secondary(pNo_PK *obras, FILE *origem, FILE *destino, int tamanhostr,int *indice, int atual, int *tamanho, int contador)  {
	char *titulo, *aux2, *aux;
	pNo_PK busca;
	size_t result;
	char *p;

	titulo = malloc((sizeof(char)*(tamanhostr+1)));
	aux = malloc((sizeof(char)*(tamanhostr+1)));
	aux2 = malloc((sizeof(char)*(tamanhostr+1)));

	fseek(origem, atual, SEEK_SET);
	result = fread (titulo,1,(tamanhostr),origem);   /* recebe o titulo e o indice da obra*/
	Fillblanks(titulo, tamanhostr);
	strcpy(aux,titulo);
	p = strtok (titulo," ");
	Str_toupper(aux);
	if ((p = strtok(NULL, " "))) { /* realiza a verificacao se uma str eh composta, caso seja, adicionara o titulo completo primeiramente */
		if ((busca = bsearch (aux, *obras, *tamanho, sizeof (struct No_PK), compara))) { /*caso ja existe no vetor sk */
			Writefile(origem, destino, contador*tam_total); /*escreve somente no arquivo com o indice atualizado */
			fprintf(destino, "%.4d", busca->nrr);
			busca->nrr = *indice; /*atualiza o vetor */ 
		}
		else { /* caso ainda nao exista */
			*tamanho = Le_PK(&(*obras),aux, *indice, *tamanho, tamanhostr); 
			Writefile(origem, destino, contador*tam_total); /* adiciona tanto no vetor como no arquivo com indice -001 */
			fputs("-001",destino); 
		}
		*indice = *indice + 1; 
	}
	p = strtok(aux," "); 
	strcpy(aux2,p);
	Str_toupper(aux2);
	Fillblanks(aux2, tamanhostr);
	while (p) { /*adicao do titulo quebrado em pedacos (strtok) ate chegar ao final (NULL) */
		if ((busca = bsearch (aux2, *obras, *tamanho, sizeof (struct No_PK), compara))) {
			Writefile(origem, destino, contador*tam_total); /* !!Similar acima, apenas com a str quebrada!! */
			fprintf(destino, "%.4d", busca->nrr);
			busca->nrr = *indice;
		}
		else {
			*tamanho = Le_PK(&(*obras),aux2, *indice, *tamanho, tamanhostr);
			Writefile(origem, destino, contador*tam_total);
			fputs("-001",destino); 				/* !!Similar acima, apenas com a str quebrada!! */
		}
		*indice = *indice + 1; 
		if ((p = strtok (NULL," "))) {
			strcpy(aux2,p);		/* quebra novamente e mantem o while ate null */
			Str_toupper(aux2);
			Fillblanks(aux2, tamanhostr);
		}
	}
	qsort (*obras, *tamanho, sizeof (No_PK), compara); /* usa o qsort para ordenar o vetor atualizado em ordem alfabetica */
	atual += tamanhostr;

free(titulo);
free(aux);
free(aux2);

	return atual;/*atualiza a posicao atual */

}
